package liecai_class.day08;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * ReadWriteLock - ReentrantReadWriteLock - 读写锁
 * 读锁和读锁可以共存
 * 写锁和任何锁都不共存
 *
 * 通过读写锁可以更加精细的控制线程之间的并发访问过程
 * 使并发的读不再被阻塞，从而提高程序的执行效率
 */
public class Demo05 {
    public static void main(String[] args) {
        ReadWriteLock lock = new ReentrantReadWriteLock();

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("t1开始执行..");
//                lock.readLock().lock();
//                System.out.println("t1得到了读锁..");
//                while(true){}
//            }
//        }).start();
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("t2开始执行..");
//                lock.readLock().lock();
//                System.out.println("t2得到了读锁..");
//                while(true){}
//            }
//        }).start();

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("t3开始执行..");
//                lock.writeLock().lock();
//                System.out.println("t3得到了写锁..");
//                while(true){}
//            }
//        }).start();
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("t4开始执行..");
//                lock.writeLock().lock();
//                System.out.println("t4得到了写锁..");
//                while(true){}
//            }
//        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t5开始执行..");
                lock.readLock().lock();
                System.out.println("t5得到了读锁..");
                while(true){}
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t6开始执行..");
                lock.writeLock().lock();
                System.out.println("t6得到了写锁..");
                while(true){}
            }
        }).start();
    }
}
